﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using Windows.ApplicationModel.Resources.Core;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Media.Imaging;
using System.Collections.Specialized;
using tricogol.metro.DataModel;
using Windows.Web.Syndication;
using System.Threading.Tasks;
using System.Runtime.Serialization.Json;
using System.Net.Http;
using tricogol.app.Data;
using Windows.Storage;

// The data model defined by this file serves as a representative example of a strongly-typed
// model that supports notification when members are added, removed, or modified.  The property
// names chosen coincide with data bindings in the standard item templates.
//
// Applications may use this model as a starting point and build on it, or discard it entirely and
// replace it with something appropriate to their needs.

namespace tricogol.metro.Data
{
    
    /// <summary>
    /// Base class for <see cref="SampleDataItem"/> and <see cref="SampleDataGroup"/> that
    /// defines properties common to both.
    /// </summary>
    [Windows.Foundation.Metadata.WebHostHidden]
    public abstract class SampleDataCommon : tricogol.metro.Common.BindableBase
    {
        string EquipoElegido;
        private static Uri _baseUri = new Uri("ms-appx:///");

        /// <summary>
        /// /Esta es la clase base donde tenemos los item principales que va a tener cada SubLayer como el de Partido de la Fecha , Tabla de Posiciones  y Partidos
        /// </summary>
        /// <param name="uniqueId"></param>
        /// <param name="title">Titulo del partido de la fecha</param>
        /// <param name="subtitle">Subtitulo del partido de la fecha</param>
        /// <param name="imagePath">Imagen para el partido de la fecha</param>
        /// <param name="description"></param>
        /// <param name="visiblePrincipal">Propiedad visible para el Grid del partido de la fecha</param>
        /// <param name="visibleTabla">Propiedad visible para el Grid Tabla de posiciones</param>
        /// <param name="visiblePartidos">Propiedad visible para el Grid de partidos</param>
        public SampleDataCommon(String uniqueId, String title, String subtitle, String imagePath, String description, String visiblePrincipal, String visibleTabla, String visiblePartidos,string visibleTwitter)
        {
            CargarDatosIniciales(uniqueId, title, subtitle, imagePath, description, visiblePrincipal, visibleTabla, visiblePartidos, visibleTwitter);


            

        }

        private async Task CargarDatosIniciales(String uniqueId, String title, String subtitle, String imagePath, String description, String visiblePrincipal, String visibleTabla, String visiblePartidos, string visibleTwitter)
        {

            this._uniqueId = uniqueId;
            this._title = title;
            this._subtitle = subtitle;
            this._description = description;
            this._imagePath = imagePath;
            this._visiblePrincipal = visiblePrincipal;
            this._visiblePartidos = visiblePartidos;
            this._visibleTabla = visibleTabla;
            this._visibleTwitter = visibleTwitter;

            //Cargo configuracion del equipo elegido
            const string archivoRuta = @"tricogol.txt";
            StorageFolder carpeta = Windows.Storage.ApplicationData.Current.LocalFolder;
            StorageFile archivo = null;
            archivo = await carpeta.CreateFileAsync(archivoRuta, CreationCollisionOption.OpenIfExists);
            EquipoElegido = await Windows.Storage.FileIO.ReadTextAsync(archivo);

            if (EquipoElegido.Equals(string.Empty)) 
            {
                EquipoElegido = "Emelec";
            }




            // Lista de ejemplo, esta lista tiene que ser llenada con todos los datos que se necesita en la tabla de posiciones que seran obtenidos de la Nube

            //------------------------------------------- FECHA ------------------------------------------------------
            await BuscaFecha();
            
            //--------------------------------------------------------------------------------------------------------
        


            //------------------------------------------- EQUIPOS ----------------------------------------------------
            await BuscaEquipos();
            
            var equipos = ListaDeEquipos;
            Equipos = new ObservableCollection<cn_equipo>(equipos);
            
            //----------------------------------------- FIN EQUIPOS --------------------------------------------------

            //------------------------------------------ ENCUENTROS --------------------------------------------------
            //Busaca los encuentros
            //TODO: Como la serializacion del jason no esta relacionada hay que buscar los equipos aparte
            await BuscaEncuentros();
            var list1 = ListaDeEncuentros;
            ListaEncuentros = new ObservableCollection<cn_encuentro>(list1);

            var list2 = ListaDeEncuentrosSiguientes;
            ListaEncuentrosSiguientes = new ObservableCollection<cn_encuentro>(list2);
            //----------------------------------------- FIN ENCUENTROS -----------------------------------------------
            
            //-------------------------------- EQUIPOS PARA IMAGENES DE LOCAL Y VISITANTE ---------------------------

            EqupiosPortada();
            var equipos2 = ListaDeEquipos2;
            Equipos2 = new ObservableCollection<cn_equipo>(equipos2);

            var equipos3 = ListaDeEquipos3;
            Equipos3 = new ObservableCollection<cn_equipo>(equipos3);
            //-------------------------------------------------------------------------------------------------------

            //------------------------------------------- POSICIONES -------------------------------------------------
            await BuscaPosiciones();
            var list = ListaDePosiciones.OrderByDescending(d => d.puntaje);
            ListaEquipos = new ObservableCollection<cn_posiciones>(list);
            //------------------------------------------- FIN POSICIONES ---------------------------------------------




            //------------------------------------------------ TWEETS ------------------------------------------------
            //Creo las clases Tweets con el equipos
            Tweets LosTweets = new Tweets() { Equipo = ListaDeEquiposTwitter.Where(s => s.id == id_equipo_local).First(), Titulo = "Tweets" };
            Tweets LosTweets1 = new Tweets() { Equipo = ListaDeEquiposTwitter.Where(s => s.id == id_equipo_visitante).First(), Titulo = "Tweets" };
            ObservableCollection<Tweets> _listaTweets = new ObservableCollection<Tweets>();
                        
            //Busca los twees
            await BuscaTweets(LosTweets);
            LosTweets.Actualizaciones = ListaTweetEquipos;
            _listaTweets.Add(LosTweets);
            
            ListaTweetEquipos = new List<string>();
            await BuscaTweets(LosTweets1);
            LosTweets1.Actualizaciones = ListaTweetEquipos;
            _listaTweets.Add(LosTweets1);
            
            var listTweets = _listaTweets;
            ListaTweets = new ObservableCollection<Tweets>(listTweets);
            //---------------------------------------------- FIN TWEETS ----------------------------------------------
        }



        //----------------------------------------------- LISTAS ------------------------------------------
        public List<string> ListaTweetEquipos = new List<string>();//Lista donde se guardan los tweets () Utilizada por el metodo BuscaTweets
        public List<cn_equipo> EquiposLocal = new List<cn_equipo>();
        public List<cn_equipo> EquiposVisitante = new List<cn_equipo>();
        public ObservableCollection<cn_encuentro> ListaDeEncuentros = new ObservableCollection<cn_encuentro>();
        public ObservableCollection<cn_encuentro> ListaDeEncuentrosSiguientes = new ObservableCollection<cn_encuentro>();
        public ObservableCollection<cn_equipo> ListaDeEquipos = new ObservableCollection<cn_equipo>();
        public ObservableCollection<cn_equipo> ListaDeEquipos2 = new ObservableCollection<cn_equipo>();
        public ObservableCollection<cn_equipo> ListaDeEquipos3 = new ObservableCollection<cn_equipo>();
        public ObservableCollection<cn_equipo> ListaDeEquiposTwitter = new ObservableCollection<cn_equipo>();
        public ObservableCollection<cn_posiciones> ListaDePosiciones = new ObservableCollection<cn_posiciones>();
        public ObservableCollection<cn_fecha> ListaDeFecha = new ObservableCollection<cn_fecha>();
        public ObservableCollection<cn_fecha> ListaDeFechaSiguiente = new ObservableCollection<cn_fecha>();
        //----------------------------------------------FIN LISTAS---------------------------------------

        //------------------ObservableCollection para que puedan ser tomados por el XAML------------------
        public ObservableCollection<cn_encuentro> ListaEncuentros { get; set; }
        public ObservableCollection<cn_encuentro> ListaEncuentrosSiguientes { get; set; }
        public ObservableCollection<cn_posiciones> ListaEquipos { get; set; }
        public ObservableCollection<Tweets> ListaTweets { get; set; }
        public ObservableCollection<cn_equipo> Equipos { get; set; }
        public ObservableCollection<cn_equipo> Equipos2 { get; set; }
        public ObservableCollection<cn_equipo> Equipos3 { get; set; }
        //------------------------------------------------------------------------------------------------
        
        //--------------------------------------ID EQUIPOS LOCAL Y VISITANTE Y FECHA ACTUAL ------------------
        int id_equipo_local;
        int id_equipo_visitante;
        int id_fecha_actual;
        int id_fecha_siguiente;
       //-----------------------------------------------------------------------------------------------

        //TODO: Agregar exepcion para cuando no hay internet.


        public void EqupiosPortada() 
        {
            List<cn_equipo> locales = (from item in EquiposLocal where item.id.Equals(id_equipo_local) select item).ToList();
            foreach (cn_equipo item in locales)
            {
                ListaDeEquipos2.Add(item);
            }
            
            List<cn_equipo> visitanes = (from item in EquiposVisitante where item.id.Equals(id_equipo_visitante) select item ).ToList();
            foreach (cn_equipo item in visitanes)
            {
                ListaDeEquipos3.Add(item);
            }
        }

        //Busca Fecha
        public async Task BuscaFecha()
        {
            Equipo asdas = new Equipo();

            string Url = "http://tricogol.azurewebsites.net/api/fecha/";
            using (HttpClient clienteHttp = new HttpClient())
            {
                HttpResponseMessage response = await clienteHttp.GetAsync(Url);
                response.EnsureSuccessStatusCode();

                using (var stream = await response.Content.ReadAsStreamAsync())
                {
                    const string dateFormat = "yyyy-MM-ddTHH:mm:ss.fffffffZ";

                    var settings = new DataContractJsonSerializerSettings
                    {
                        DateTimeFormat = new System.Runtime.Serialization.DateTimeFormat(dateFormat)
                    };


                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(ObservableCollection<cn_fecha>), settings);
                    ObservableCollection<cn_fecha> fecha_actual = serializer.ReadObject(stream) as ObservableCollection<cn_fecha>; 
                    ListaDeFecha = new ObservableCollection<cn_fecha>( fecha_actual.Where(s => s.actual == true).ToList());
                    id_fecha_actual = (from item in ListaDeFecha select item.id).ToList().First();

                    ListaDeFechaSiguiente = new ObservableCollection<cn_fecha>(fecha_actual.Where(s => s.actual == false && s.terminado == false).ToList());
                    id_fecha_siguiente = (from item in ListaDeFechaSiguiente select item.id).ToList().First();

                   
                }
            }
        }



         //Busca Tweets
        public async Task BuscaTweets(Tweets tweets)
        {
            
  
            SyndicationClient client = new SyndicationClient();
           

            SyndicationFeed feed = await client.RetrieveFeedAsync(new Uri("http://search.twitter.com/search.rss?q=" + tweets.Equipo.imagen));            
            
            //TODO: Combinar tweets del equipo nombra con el de la pagina official :
            //SyndicationFeed feed = await client.RetrieveFeedAsync(new Uri("https://api.twitter.com/1/statuses/user_timeline.rss?screen_name=" + tweets.Equipo.imagen));            
            
            foreach (var item in feed.Items)
            {
                 ListaTweetEquipos.Add(item.Title.Text);
            }
           
        }
    
        //Busca los encuentros
        public async Task BuscaEncuentros()
        {
            string Url = "http://tricogol.azurewebsites.net/api/Encuentro/";
            using (HttpClient clienteHttp = new HttpClient())
            {
                HttpResponseMessage response = await clienteHttp.GetAsync(Url);
                response.EnsureSuccessStatusCode();

                using (var stream = await response.Content.ReadAsStreamAsync())
                {
                    const string dateFormat = "yyyy-MM-ddTHH:mm:ss.fffffffZ";

                    var settings = new DataContractJsonSerializerSettings
                    {
                        DateTimeFormat = new System.Runtime.Serialization.DateTimeFormat(dateFormat)
                    };


                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(ObservableCollection<cn_encuentro>), settings);

                    ObservableCollection<cn_encuentro> objetocomplete = serializer.ReadObject(stream) as ObservableCollection<cn_encuentro>;
                    ObservableCollection<cn_encuentro> objetofiltrer = new ObservableCollection<cn_encuentro>(objetocomplete.Where(s => s.id_fecha.Equals(id_fecha_actual)).ToList());
                    ObservableCollection<cn_encuentro> objetofiltrer_siguiente = new ObservableCollection<cn_encuentro>(objetocomplete.Where(s => s.id_fecha.Equals(id_fecha_siguiente)).ToList());


                    GenerarImagenLocal();

                    GenerarEncuentros(objetofiltrer, ListaDeEncuentros);
                    GenerarEncuentros(objetofiltrer_siguiente, ListaDeEncuentrosSiguientes);


                    id_equipo_local = (from it in ListaDeEncuentrosSiguientes where it.cn_equipo.nombre.Equals(EquipoElegido) || it.cn_equipo1.nombre.Equals(EquipoElegido) select it.cn_equipo.id).ToList().First();
                    id_equipo_visitante = (from it in ListaDeEncuentrosSiguientes where it.cn_equipo.nombre.Equals(EquipoElegido) || it.cn_equipo1.nombre.Equals(EquipoElegido) select it.cn_equipo1.id).ToList().First();


                }
            }

        }

        public void GenerarImagenLocal() 
        {
            foreach (cn_equipo item in ListaDeEquipos)
            {

                item.imagen = @"Assets/Logo/" + item.imagen;
            }
        }


        public void GenerarEncuentros(ObservableCollection<cn_encuentro> ListaEncuentrosRecivida, ObservableCollection<cn_encuentro> ListaEncuentrosParaLlenar) 
        {

            foreach (cn_encuentro item in ListaEncuentrosRecivida)
            {
                
                var local = from n in ListaDeEquipos where n.id == item.equipo_local select n;
                var visitante = from n in ListaDeEquipos where n.id == item.equipo_visitante select n;

                cn_encuentro nuevo = new cn_encuentro();

                item.cn_equipo = local.First();
                item.cn_equipo1 = visitante.First();
                ListaEncuentrosParaLlenar.Add(item);
            }

        }

        //Busca los equipos
        public async Task BuscaEquipos()
        {
            string Url = "http://tricogol.azurewebsites.net/api/Equipo/";
            using (HttpClient clienteHttp = new HttpClient())
            {
                HttpResponseMessage response = await clienteHttp.GetAsync(Url);
                response.EnsureSuccessStatusCode();

                using (var stream = await response.Content.ReadAsStreamAsync())
                {
                    const string dateFormat = "yyyy-MM-ddTHH:mm:ss.fffffffZ";

                    var settings = new DataContractJsonSerializerSettings
                    {
                        DateTimeFormat = new System.Runtime.Serialization.DateTimeFormat(dateFormat)
                    };


                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(ObservableCollection<cn_equipo>), settings);

                    ObservableCollection<cn_equipo> objetoreturn = serializer.ReadObject(stream) as ObservableCollection<cn_equipo>;
                    
                    List<cn_equipo> equipos =  (from item in objetoreturn
                                                              select new cn_equipo ()
                                                              {
                                                                  cn_encuentro = item.cn_encuentro,
                                                                  cn_posiciones = item.cn_posiciones,
                                                                  cn_encuentro1 = item.cn_encuentro1,
                                                                  descripcion =  item.descripcion,
                                                                  id = item.id,
                                                                  imagen = item.imagen.Split('|')[0],
                                                                  nombre = item.nombre,
                                                                  url_web = item.url_web

                                                              }).ToList();
                    foreach (cn_equipo item in equipos)
                    {
                        ListaDeEquipos.Add(item);
                    }


                    EquiposLocal = (from item in objetoreturn
                                                
                                                              select new cn_equipo ()
                                                              {
                                                                  cn_encuentro = item.cn_encuentro,
                                                                  cn_posiciones = item.cn_posiciones,
                                                                  cn_encuentro1 = item.cn_encuentro1,
                                                                  descripcion =  item.descripcion,
                                                                  id = item.id,
                                                                  imagen = @"http://iddqdqwerty.azurewebsites.net/Images/Portada/Izquierda/" + item.imagen.Split('|')[1],
                                                                  nombre = item.nombre,
                                                                  url_web = item.url_web

                                                              }).ToList();
                    

                    EquiposVisitante = (from item in objetoreturn
                                                
                                                              select new cn_equipo ()
                                                              {
                                                                  cn_encuentro = item.cn_encuentro,
                                                                  cn_posiciones = item.cn_posiciones,
                                                                  cn_encuentro1 = item.cn_encuentro1,
                                                                  descripcion =  item.descripcion,
                                                                  id = item.id,
                                                                  imagen =  @"http://iddqdqwerty.azurewebsites.net/Images/Portada/Derecha/" +item.imagen.Split('|')[1],
                                                                  nombre = item.nombre,
                                                                  url_web = item.url_web

                                                              }).ToList();
                    


                    List<cn_equipo> equipos_twitter = (from item in objetoreturn
                                                              select new cn_equipo ()
                                                              {
                                                                  cn_encuentro = item.cn_encuentro,
                                                                  cn_posiciones = item.cn_posiciones,
                                                                  cn_encuentro1 = item.cn_encuentro1,
                                                                  descripcion =  item.descripcion,
                                                                  id = item.id,
                                                                  imagen = item.imagen.Split('|')[2],
                                                                  nombre = item.nombre,
                                                                  url_web = item.url_web

                                                              }).ToList();
                    foreach (cn_equipo item in equipos_twitter)
                    {
                        ListaDeEquiposTwitter.Add(item);
                    }



                    
                }
            }
        }


        //Busca las posiciones
        public async Task BuscaPosiciones()
        {
            Equipo asdas = new Equipo();
          
            string Url = "http://tricogol.azurewebsites.net/api/posiciones/";
            using (HttpClient clienteHttp = new HttpClient())
            {
                HttpResponseMessage response = await clienteHttp.GetAsync(Url);
                response.EnsureSuccessStatusCode();

                using (var stream = await response.Content.ReadAsStreamAsync())
                {
                    const string dateFormat = "yyyy-MM-ddTHH:mm:ss.fffffffZ";

                    var settings = new DataContractJsonSerializerSettings
                    {
                        DateTimeFormat = new System.Runtime.Serialization.DateTimeFormat(dateFormat)
                    };


                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(ObservableCollection<cn_posiciones>), settings);

                    ObservableCollection<cn_posiciones> objetoreturn = serializer.ReadObject(stream) as ObservableCollection<cn_posiciones>;
                    foreach (cn_posiciones item in objetoreturn)
                    {

                        if (item.id_fecha == id_fecha_actual)
                        {
                            var query = from obj in ListaDeEquipos where obj.id.Equals(item.equipo) select obj;

                            //var equipo = from n in ListaDeEquipos where n.id.Equals(item.equipo) && item.id_fecha.Equals(id_fecha_actual) select n;
                            item.cn_equipo = query.First();
                            ListaDePosiciones.Add(item);
                        }
                    }

                }
            }
        }


        


        private string _visiblePrincipal = string.Empty;
        public string VisiblePrincipal
        {
            get { return _visiblePrincipal; }
            set { this.SetProperty(ref this._visiblePrincipal, value); }
        }

        private string _visibleTabla = string.Empty;
        public string VisibleTabla
        {
            get { return _visibleTabla; }
            set { this.SetProperty(ref this._visibleTabla, value); }
        }

     

        private string _visiblePartidos = string.Empty;
        public string VisiblePartidos
        {
            get { return _visiblePartidos; }
            set { this.SetProperty(ref this._visiblePartidos, value); }
        }


        private string _visibleTwitter = string.Empty;

        public string VisibleTwitter
        {
            get { return _visibleTwitter; }
            set {  this.SetProperty(ref this._visibleTwitter, value); }
        }

        private string _uniqueId = string.Empty;
        public string UniqueId
        {
            get { return this._uniqueId; }
            set { this.SetProperty(ref this._uniqueId, value); }
        }

        private string _title = string.Empty;
        public string Title
        {
            get { return this._title; }
            set { this.SetProperty(ref this._title, value); }
        }

        private string _subtitle = string.Empty;
        public string Subtitle
        {
            get { return this._subtitle; }
            set { this.SetProperty(ref this._subtitle, value); }
        }

        private string _description = string.Empty;
        public string Description
        {
            get { return this._description; }
            set { this.SetProperty(ref this._description, value); }
        }

        private ImageSource _image = null;
        private String _imagePath = null;
        public ImageSource Image
        {
            get
            {
                if (this._image == null && this._imagePath != null)
                {
                    this._image = new BitmapImage(new Uri(SampleDataCommon._baseUri, this._imagePath));
                }
                return this._image;
            }

            set
            {
                this._imagePath = null;
                this.SetProperty(ref this._image, value);
            }
        }

        public void SetImage(String path)
        {
            this._image = null;
            this._imagePath = path;
            this.OnPropertyChanged("Image");
        }

        public override string ToString()
        {
            return this.Title;
        }
    }

    /// <summary>
    /// Generic item data model.
    /// </summary>
    public class SampleDataItem : SampleDataCommon
    {
        public SampleDataItem(String uniqueId, String title, String subtitle, String imagePath, String description, String content, SampleDataGroup group, String visiblePrincipal, String visibleTabla, String visiblePartidos,String visibleTwitter)
            : base(uniqueId, title, subtitle, imagePath, description, visiblePrincipal, visibleTabla,visiblePartidos,visibleTwitter)
        {
            this._content = content;
            this._group = group;
        }

        private string _content = string.Empty;
        public string Content
        {
            get { return this._content; }
            set { this.SetProperty(ref this._content, value); }
        }

        private SampleDataGroup _group;
        public SampleDataGroup Group
        {
            get { return this._group; }
            set { this.SetProperty(ref this._group, value); }
        }
    }

    /// <summary>
    /// Generic group data model.
    /// </summary>
    public class SampleDataGroup : SampleDataCommon
    {
        public SampleDataGroup(String uniqueId, String title, String subtitle, String imagePath, String description, String visiblePrincipal, String visibleTabla, String visiblePartidos,String visibleTwitter)
            : base(uniqueId, title, subtitle, imagePath, description, visiblePrincipal, visibleTabla, visiblePartidos,visibleTwitter)
        {
            Items.CollectionChanged += ItemsCollectionChanged;
        }

        private void ItemsCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            // Provides a subset of the full items collection to bind to from a GroupedItemsPage
            // for two reasons: GridView will not virtualize large items collections, and it
            // improves the user experience when browsing through groups with large numbers of
            // items.
            //
            // A maximum of 12 items are displayed because it results in filled grid columns
            // whether there are 1, 2, 3, 4, or 6 rows displayed

            switch (e.Action)
            {
                case NotifyCollectionChangedAction.Add:
                    if (e.NewStartingIndex < 12)
                    {
                        TopItems.Insert(e.NewStartingIndex,Items[e.NewStartingIndex]);
                        if (TopItems.Count > 12)
                        {
                            TopItems.RemoveAt(12);
                        }
                    }
                    break;
                case NotifyCollectionChangedAction.Move:
                    if (e.OldStartingIndex < 12 && e.NewStartingIndex < 12)
                    {
                        TopItems.Move(e.OldStartingIndex, e.NewStartingIndex);
                    }
                    else if (e.OldStartingIndex < 12)
                    {
                        TopItems.RemoveAt(e.OldStartingIndex);
                        TopItems.Add(Items[11]);
                    }
                    else if (e.NewStartingIndex < 12)
                    {
                        TopItems.Insert(e.NewStartingIndex, Items[e.NewStartingIndex]);
                        TopItems.RemoveAt(12);
                    }
                    break;
                case NotifyCollectionChangedAction.Remove:
                    if (e.OldStartingIndex < 12)
                    {
                        TopItems.RemoveAt(e.OldStartingIndex);
                        if (Items.Count >= 12)
                        {
                            TopItems.Add(Items[11]);
                        }
                    }
                    break;
                case NotifyCollectionChangedAction.Replace:
                    if (e.OldStartingIndex < 12)
                    {
                        TopItems[e.OldStartingIndex] = Items[e.OldStartingIndex];
                    }
                    break;
                case NotifyCollectionChangedAction.Reset:
                    TopItems.Clear();
                    while (TopItems.Count < Items.Count && TopItems.Count < 12)
                    {
                        TopItems.Add(Items[TopItems.Count]);
                    }
                    break;
            }
        }

        private ObservableCollection<SampleDataItem> _items = new ObservableCollection<SampleDataItem>();
        public ObservableCollection<SampleDataItem> Items
        {
            get { return this._items; }
        }

        private ObservableCollection<SampleDataItem> _topItem = new ObservableCollection<SampleDataItem>();
        public ObservableCollection<SampleDataItem> TopItems
        {
            get {return this._topItem; }
        }
    }

    /// <summary>
    /// Creates a collection of groups and items with hard-coded content.
    /// 
    /// SampleDataSource initializes with placeholder data rather than live production
    /// data so that sample data is provided at both design-time and run-time.
    /// </summary>
    public sealed class SampleDataSource
    {
        private static SampleDataSource _sampleDataSource = new SampleDataSource();

        private ObservableCollection<SampleDataGroup> _allGroups = new ObservableCollection<SampleDataGroup>();
        public ObservableCollection<SampleDataGroup> AllGroups
        {
            get { return this._allGroups; }
        }

        public static IEnumerable<SampleDataGroup> GetGroups(string uniqueId)
        {
            if (!uniqueId.Equals("AllGroups")) throw new ArgumentException("Only 'AllGroups' is supported as a collection of groups");
            
            return _sampleDataSource.AllGroups;
        }

        public static SampleDataGroup GetGroup(string uniqueId)
        {
            // Simple linear search is acceptable for small data sets
            var matches = _sampleDataSource.AllGroups.Where((group) => group.UniqueId.Equals(uniqueId));
            if (matches.Count() == 1) return matches.First();
            return null;
        }

        public static SampleDataItem GetItem(string uniqueId)
        {
            // Simple linear search is acceptable for small data sets
            var matches = _sampleDataSource.AllGroups.SelectMany(group => group.Items).Where((item) => item.UniqueId.Equals(uniqueId));
            if (matches.Count() == 1) return matches.First();
            return null;
        }

        public SampleDataSource()
        {
            String ITEM_CONTENT = "";

            var group1 = new SampleDataGroup("Campeonato Ecuatoriano de Futbol",
                    "",
                    "Campeonato",
                    "Assets/DarkGray.png",
                    "",
                    "",
                    "",
                    "",
                    ""
                    );

            //group1.Items.Add(new SampleDataItem("asd", "asd", "asd", "Assets/Grass1.jpg", "asd",ITEM_CONTENT,group1));//Aqui agrego la imgen a uno de los cuadros pequenos
            group1.Items.Add(new SampleDataItem("Group-1-Item-1",
                    "",
                    "",
                    "Assets/Fonfo.png",
                    "",
                    ITEM_CONTENT,
                    group1,
                    "Visible",
                    "Collapsed",
                    "Collapsed","Collapsed"));
            group1.Items.Add(new SampleDataItem("Group-1-Item-2",
                    "Tabla de Posiciones",
                    "",
                    "Transparent",
                    "",
                    ITEM_CONTENT,
                    group1,
                    "Collapsed",
                    "Visible",
                    "Collapsed","Collapsed"));
            group1.Items.Add(new SampleDataItem("Group-1-Item-3",
                    "Calendario",
                    "",
                    "Transparent",
                    "",
                    ITEM_CONTENT,
                    group1,
                    "Collapsed",
                    "Collapsed",
                    "Visible","Collapsed"));

        group1.Items.Add(new SampleDataItem("Group-1-Item-4",
            "Tweets de la Fecha",
            "",
            "Tramsparent",
            "Lee lo mas destacado en Twitter",
            ITEM_CONTENT,
            group1,
            "Collapsed",
            "Collapsed",
            "Collapsed",
            "Visible"));

            



            // SampleDataGroup nuevo = new SampleDataGroup("asd", "asd", "asd", "Assets/Grass1.jpg", "asd");

            //this.AllGroups.Add(nuevo);
            this.AllGroups.Add(group1);
                       
        }
    }
}
